
package com.jf.cloud.order.mapper;

import com.jf.cloud.api.order.bo.RefundAmountWithOrderIdBO;
import com.jf.cloud.api.order.vo.OrderRefundSimpleVO;
import com.jf.cloud.common.database.util.PageAdapter;
import com.jf.cloud.common.order.dto.OrderRefundSearchDTO;
import com.jf.cloud.order.bo.mongo.MongoOrderRefundBO;
import com.jf.cloud.order.bo.mongo.MongoOrderRefundItemBO;
import com.jf.cloud.order.dto.app.OrderRefundPageDTO;
import com.jf.cloud.order.model.OrderRefund;
import com.jf.cloud.order.vo.OrderRefundStatisticsVO;
import com.jf.cloud.order.vo.OrderRefundVO;
import org.apache.ibatis.annotations.Param;

import java.util.Date;
import java.util.List;

/**
 * 订单退款记录信息
 *
 * @author zz
 * @date 2020-12-05 14:13:50
 */
public interface OrderRefundMapper {

    /**
     * 获取订单退款记录信息列表
     *
     * @param orderRefundPageDTO
     * @param pageAdapter
     * @return 订单退款记录信息列表
     */
    List<OrderRefundVO> list(@Param("orderRefundPageDTO") OrderRefundPageDTO orderRefundPageDTO, @Param("pageAdapter") PageAdapter pageAdapter);

    /**
     * 获取订单退款记录信息列表数量
     *
     * @param orderRefundPageDTO
     * @return 订单退款记录信息列表数量
     */
    Long count(@Param("orderRefundPageDTO") OrderRefundPageDTO orderRefundPageDTO);

    /**
     * 根据订单退款记录信息id获取订单退款记录信息
     *
     * @param refundId 订单退款记录信息id
     * @return 订单退款记录信息
     */
    OrderRefundVO getByRefundId(@Param("refundId") Long refundId);

    /**
     * 保存订单退款记录信息
     *
     * @param orderRefund 订单退款记录信息
     */
    void save(@Param("orderRefund") OrderRefund orderRefund);

    /**
     * 更新订单退款记录信息
     *
     * @param orderRefund 订单退款记录信息
     */
    void update(@Param("orderRefund") OrderRefund orderRefund);

    /**
     * 根据订单退款记录信息id删除订单退款记录信息
     *
     * @param refundId
     */
    void deleteById(@Param("refundId") Long refundId);

    /**
     * 根据订单id获取退款金额
     *
     * @param orderIds 订单id
     * @return
     */
    List<RefundAmountWithOrderIdBO> sumRefundSuccessAmountByOrderId(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderId
     * @return
     */
    List<OrderRefund> getProcessOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderIds
     * @return
     */
    List<OrderRefundVO> getProcessOrderRefundByOrderIds(@Param("orderIds") List<Long> orderIds);

    /**
     * 根据订单id，获取正在退款中或退款成功的订单
     *
     * @param orderId        订单id
     * @param returnMoneySts 退款状态
     * @return 成功的退款订单
     */
    List<com.jf.cloud.api.order.vo.OrderRefundVO> getOrderRefundByOrderIdAndRefundStatus(@Param("orderId") Long orderId, @Param("returnMoneySts") Integer returnMoneySts);

    /**
     * 获取订单正在进行退款的退款数量
     *
     * @param returnMoneySts
     * @param returnMoneySts2
     * @param orderId
     * @return
     */
    Integer countByReturnMoneyStsAndOrderId(@Param("returnMoneySts") Integer returnMoneySts, @Param("returnMoneySts2") Integer returnMoneySts2, @Param("orderId") Long orderId);

    /**
     * 正在进行退款的退款订单数量
     *
     * @param orderId 订单号
     * @return 正在进行退款的退款订单数量
     */
    Integer countReturnProcessingItemByOrderId(@Param("orderId") Long orderId);


    /**
     * 查询退款成功的订单商品数量
     *
     * @param orderId
     * @return
     */
    Integer countRefundSuccessRefundCountByOrderId(@Param("orderId") Long orderId);


    /**
     * 同意退货
     * <p>
     * 注意：如果你无法理解下面这句话的话，请不要随意更改里面sql的where语句
     * 众所周知，如果不是申请的话，下一步不可能是同意退货，
     * 但是在执行下面代码之前，退款的状态是可能发生改变的，
     * 也就是下面这条sql执行之前进行了退款状态的改变（比如同意退款），那会造成不可预知的后果，
     * 所以更新订单状态的时候也要在条件当中加上退款状态，确定这条sql是原子性的
     *
     * @param sellerMsg
     * @param refundId
     * @return
     */
    int agreeReturns(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId);

    /**
     * 拒绝退款
     * <p>
     * 注意：如果你无法理解下面这句话的话，请不要随意更改里面的sql的where语句
     * 众所周知，如果不是申请的话，下一步不可能是拒绝，
     * 但是在执行下面代码之前，退款的状态是可能发生改变的，
     * 也就是下面这条sql执行之前进行了退款状态的改变（比如同意退款），那会造成不可预知的后果，
     * 所以更新订单状态的时候也要在条件当中加上退款状态，确定这条sql是原子性的
     *
     * @param sellerMsg
     * @param rejectMessage
     * @param refundId
     * @param returnMoneySts
     * @param receiver
     * @param supplierHandleStatus
     * @return
     */
    int disagreeRefund(@Param("sellerMsg") String sellerMsg, @Param("rejectMessage") String rejectMessage, @Param("refundId") Long refundId,
                       @Param("returnMoneySts") Integer returnMoneySts, @Param("receiver") Boolean receiver, @Param("supplierHandleStatus") Integer supplierHandleStatus);

    /**
     * 同意退款
     *
     * @param sellerMsg
     * @param refundId
     * @param returnMoneySts
     * @param receiver
     * @param applyType
     * @param purchaseRefundAmount
     * @return
     */
    int agreeRefund(@Param("sellerMsg") String sellerMsg, @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts,
                    @Param("receiver") Boolean receiver, @Param("applyType") Integer applyType, @Param("refundAmount") Long refundAmount, @Param("purchaseRefundAmount") Long purchaseRefundAmount);

    /**
     * 获取退款状态
     *
     * @param refundId
     * @return
     */
    Integer getRefundStatus(@Param("refundId") Long refundId);

    /**
     * 获取指定时间范围的退款订单比率信息及退款金额统计列表
     *
     * @param shopId
     * @param startTime
     * @param endTime
     * @param dayCount
     * @return
     */
    List<OrderRefundStatisticsVO> listOrderRefundInfoByShopIdAndDateRange(@Param("shopId") Long shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("dayCount") Integer dayCount);

    /**
     * 根据指定时间范围获取根据商品名生成退款排行
     *
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    List<OrderRefundStatisticsVO> listRefundRankingByProd(@Param("shopId") Long shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据日期范围获取订单退款概况概况信息
     *
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    OrderRefundStatisticsVO getOrderRefundInfoByShopId(@Param("shopId") Long shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 根据日期范围获取订单退款概况概况信息
     *
     * @param supplierId
     * @param startTime
     * @param endTime
     * @return
     */
    OrderRefundStatisticsVO getOrderRefundInfoBySupplierId(@Param("supplierId") Long supplierId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取退款原因排行
     *
     * @param shopId
     * @param startTime
     * @param endTime
     * @return
     */
    List<OrderRefundStatisticsVO> listRefundRankingByReason(@Param("shopId") Long shopId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 获取店铺退单数量排行
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @param limit     排行榜取几条数据
     * @return
     */
    List<OrderRefundStatisticsVO> listShopRankingByRefundCount(@Param("startTime") Date startTime, @Param("endTime") Date endTime, @Param("limit") Integer limit);

    /**
     * 通过订单id获取正在处理中的退款订单
     *
     * @param orderId 订单id
     * @return 正在处理中的退款订单
     */
    List<OrderRefundVO> getProcessingOrderRefundByOrderId(@Param("orderId") Long orderId);

    /**
     * 批量更新订单退款记录信息
     *
     * @param orderRefundList 订单退款记录信息
     */
    void updateBatchById(@Param("orderRefundList") List<OrderRefundVO> orderRefundList);

    /**
     * 根据退款单号列表获取订单号列表
     *
     * @param refundIds
     * @return
     */
    List<OrderRefundSimpleVO> listOrderIdsByRefundIds(@Param("refundIds") List<Long> refundIds);

    /**
     * 移交供应商处理，改变下状态即可
     *
     * @param oldSupplierHandleStatus 供应商处理状态(旧)
     * @param supplierHandleStatus    移交供应商处理状态
     * @param refundId                退款id
     * @param returnMoneySts          退款状态
     * @return 结果
     */
    int transferRefundOrderToSupplier(@Param("oldSupplierHandleStatus") Integer oldSupplierHandleStatus, @Param("supplierHandleStatus") Integer supplierHandleStatus,
                                      @Param("refundId") Long refundId, @Param("returnMoneySts") Integer returnMoneySts);

    /**
     * 获取退款成功总数
     *
     * @param orderId
     * @return
     */
    int countSuccessItemNum(Long orderId);

    /**
     * 获取订单的移交供应商处理的状态
     *
     * @param orderId 订单id
     * @return 移交供应商处理的状态
     */
    int getSupplierHandleStatusByOrderId(@Param("orderId") Long orderId);

    /**
     * 获取mongodb和es的退款订单信息
     *
     * @param refundId
     * @return
     */
    MongoOrderRefundBO mongoAndEsOrderRefundInfo(@Param("refundId") Long refundId);

    /**
     * 获取订单有关信息
     *
     * @param orderId
     * @return
     */
    MongoOrderRefundBO mongoEsOrder(@Param("orderId") Long orderId);

    /**
     * 取mongodb和es的退款订单项信息
     *
     * @param orderId
     * @param orderItemId
     * @return
     */
    List<MongoOrderRefundItemBO> mongoAndEsOrderRefundItems(@Param("orderId") Long orderId, @Param("orderItemId") Long orderItemId, @Param("giveawayList") List<Long> giveawayList);

    /**
     * @param refundId
     * @return
     */
    OrderRefundVO getOrderRefundTimeOutInfo(@Param("refundId") Long refundId, @Param("date") Date date);

    List<OrderRefundVO> listUserOrderRefund(@Param("orderRefundSearchDTO") OrderRefundSearchDTO orderRefundSearchDTO);
}
